package cn.iocoder.yudao.module.member.statistics.service;

import cn.iocoder.yudao.framework.business.basic.pojo.bo.DataComparison;
import cn.iocoder.yudao.module.member.statistics.pojo.bo.MemberRegisterCountRespBO;
import cn.iocoder.yudao.module.member.statistics.pojo.bo.MemberSexStatisticsRespBO;
import cn.iocoder.yudao.module.member.statistics.pojo.bo.MemberTerminalStatisticsRespBO;
import cn.iocoder.yudao.module.member.statistics.pojo.vo.*;
import jakarta.annotation.Nullable;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户信息的统计 Service 实现类
 *
 * @author owen
 */
public interface MemberStatisticsService {

    /**
     * 获取用户统计（实时统计）
     *
     * @return 用户统计
     */
    MemberSummaryRespVO getMemberSummary();

    /**
     * 获取用户分析对照数据
     *
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @return 用户分析对照数据
     */
    DataComparison<MemberAnalyseDataRespVO> getMemberAnalyseComparisonData(LocalDateTime beginTime,
                                                                           LocalDateTime endTime);

    /**
     * 按照省份，获得用户统计列表
     *
     * @return 用户统计列表
     */
    List<MemberAreaStatisticsRespVO> getMemberAreaStatisticsList();

    /**
     * 按照性别，获得用户统计列表
     *
     * @return 用户统计列表
     */
    List<MemberSexStatisticsRespBO> getMemberSexStatisticsList();

    /**
     * 按照终端，获得用户统计列表
     *
     * @return 用户统计列表
     */
    List<MemberTerminalStatisticsRespBO> getMemberTerminalStatisticsList();

    /**
     * 获取用户注册数量列表
     *
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @return 注册数量列表
     */
    List<MemberRegisterCountRespBO> getMemberRegisterCountList(LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 获得用户数量量统计对照
     *
     * @return 用户数量量统计对照
     */
    DataComparison<MemberCountRespVO> getUserCountComparison();

    /**
     * 获取活跃用户数量
     *
     * @param userType  用户类型
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @return 活跃用户数量
     */
    Integer getUserCount(Integer userType, LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 获取访问用户数量
     *
     * @param userType  用户类型
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @return 访问用户数量
     */
    Integer getIpCount(Integer userType, LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 异步获取某个用户的数据汇总
     *
     * @param userId 用户编号
     */
    AppMemberCenterSummaryRespVO getMemberCenterSummaryAndSyncToRedis(@Nullable Long userId);

}
